home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / RSCCUBTN.C < prev    next >
C/C++ Source or Header  |  1992-04-06  |  7KB  |  220 lines

  1. /**************************************************************************
  2.  * RSCCUBTN.C - The rsc_cubuttons() routine.
  3.  *   This changes the specified objects into CUA-style selection & radio
  4.  *   buttons (by making them USERDEF objects), and supplies the drawing
  5.  *   routine for the buttons.
  6.  *************************************************************************/
  7.  
  8. #include <stdarg.h>
  9. #include "gemfast.h"
  10.  
  11. #ifndef NULL
  12.   #define NULL 0L
  13. #endif
  14.  
  15. typedef struct {
  16.     int wchar;
  17.     int hchar;
  18.     int outer_radius;
  19.     int inner_radius;
  20.     int text_xoffs;
  21.     int text_yoffs;
  22.     int circle_xoffs;
  23.     int circle_yoffs;
  24.     int box_xoffs;
  25.     int box_yoffs;
  26.     int box_xsize;
  27.     int box_ysize;
  28. } PreCalcs;
  29.  
  30. static PreCalcs precalcs;
  31.  
  32. /*-------------------------------------------------------------------------
  33.  * init_precalcs - Fill in the precalculated values structure.
  34.  *-----------------------------------------------------------------------*/
  35.  
  36. static void init_precalcs()
  37. {
  38.     register PreCalcs  *pc      = &precalcs;
  39.     register int        wchar   = gl_wchar;
  40.     register int        hchar   = gl_hchar;
  41.     register int        h8      = hchar / 8;
  42.     register int        aspectx = gl_vwout[3];
  43.     register int        aspecty = gl_vwout[4];
  44.  
  45.     pc->wchar        = wchar;
  46.     pc->hchar        = hchar;
  47.     
  48.     pc->text_xoffs   = wchar * 3;               
  49.     pc->text_yoffs   = 0;
  50.     
  51.     pc->box_ysize    = hchar - h8;
  52.     pc->box_xsize    = (pc->box_ysize * aspecty) / aspectx; 
  53.     pc->box_xoffs    = 1;
  54.     pc->box_yoffs    = 0;
  55.     
  56.     pc->outer_radius = ((hchar * aspecty) / aspectx) / 2;
  57.     pc->inner_radius = pc->outer_radius / 2;    
  58.     pc->circle_xoffs = pc->outer_radius + pc->box_xoffs;
  59.     pc->circle_yoffs = (hchar / 2) - h8;     
  60.     
  61. }
  62.  
  63. /*-------------------------------------------------------------------------
  64.  * cua_draw - Draw a CUA-style button.  This routine is called by
  65.  *            the AES whenever a CUA-style button needs to be drawn
  66.  *            or to have its state changed.  (Note that this routine
  67.  *            gets control in supervisor mode.  Some runtime libraries
  68.  *            will crash on stack overlow problems if you make calls
  69.  *            to DOS, BIOS, or XBIOS from in here.)
  70.  *
  71.  *            We handle SELECTED, CROSSED, OUTLINED, and DISABLED states
  72.  *            here, but other states are handled by the AES because we
  73.  *            pass the states we didn't do back to the AES as the return
  74.  *            value from this routine.
  75.  *-----------------------------------------------------------------------*/
  76.  
  77. static long cua_draw(parmblk)
  78.     register XPARMBLK  *parmblk;
  79. {
  80.     register PreCalcs  *pc = &precalcs;
  81.     int                 dmy;
  82.     register int        xpos;
  83.     register int        ypos;
  84.     register int        vdi_handle;
  85.     register int        objstate;
  86.     VRECT               boxrect;
  87.     VRECT               cliprect;
  88.  
  89.     if (0 == (vdi_handle = apl_vshared())) {
  90.         return 0;   /* oh well, so sorry */
  91.     }
  92.  
  93.     objstate = parmblk->currstate;
  94.  
  95.     rc_gtov(&parmblk->cliprect, &cliprect);
  96.     vs_clip(vdi_handle, 1, &cliprect);
  97.     vsf_interior(vdi_handle, IS_HOLLOW);
  98.  
  99.     xpos = parmblk->drawrect.g_x;
  100.     ypos = parmblk->drawrect.g_y + ((parmblk->drawrect.g_h - pc->hchar) / 2);
  101.  
  102.     if (objstate & DISABLED) {
  103.         vst_effect(vdi_handle, 0x0002);
  104.     }
  105.     vst_alignment(vdi_handle, 0, 5, &dmy, &dmy);
  106.     v_gtext(vdi_handle, (xpos + pc->text_xoffs), (ypos + pc->text_yoffs),
  107.             parmblk->pub->ob_spec);
  108.     vst_alignment(vdi_handle, 0, 0, &dmy, &dmy);
  109.     if (objstate & DISABLED) {
  110.         vst_effect(vdi_handle, 0x0000);
  111.     }
  112.  
  113.     if (parmblk->ptree[parmblk->obj].ob_flags & RBUTTON) {
  114.         xpos += pc->circle_xoffs;
  115.         ypos += pc->circle_yoffs;
  116.         v_circle(vdi_handle, xpos, ypos, pc->outer_radius);
  117.         if (objstate & (SELECTED|CROSSED)) {
  118.             vsf_interior(vdi_handle, IS_SOLID);
  119.             v_circle(vdi_handle, xpos, ypos, pc->inner_radius);
  120.             vsf_interior(vdi_handle, IS_HOLLOW);
  121.         }
  122.     } else {
  123.         boxrect.v_x1 = xpos + pc->box_xoffs;
  124.         boxrect.v_y1 = ypos + pc->box_yoffs;
  125.         boxrect.v_x2 = boxrect.v_x1 + pc->box_xsize;
  126.         boxrect.v_y2 = boxrect.v_y1 + pc->box_ysize;
  127.         v_bar(vdi_handle, &boxrect);
  128.         if (objstate & (SELECTED|CROSSED)) {
  129.             register int temp;
  130.             v_pline(vdi_handle, 2, &boxrect);
  131.             temp         = boxrect.v_x1;
  132.             boxrect.v_x1 = boxrect.v_x2;
  133.             boxrect.v_x2 = temp;
  134.             v_pline(vdi_handle, 2, &boxrect);
  135.         }
  136.     }
  137.  
  138.     if (objstate & OUTLINED) {
  139.         rc_gtov(&parmblk->drawrect, &boxrect);
  140.         rc_vadjust(&boxrect, 3, 3);
  141.         vswr_mode(vdi_handle, MD_TRANS);
  142.         v_bar(vdi_handle, &boxrect);
  143.         vswr_mode(vdi_handle, MD_REPLACE);
  144.     }
  145.     
  146.     vsf_interior(vdi_handle, IS_SOLID);
  147.     vs_clip(vdi_handle, 0, &cliprect);
  148.     
  149.     return (objstate & ~(SELECTED|DISABLED|OUTLINED|CROSSED));
  150. }
  151.  
  152. /*-------------------------------------------------------------------------
  153.  * rsc_cubuttons - Transform all non-exit buttons in a tree to CUA-style.
  154.  *-----------------------------------------------------------------------*/
  155.  
  156. int rsc_cubuttons(ptree)
  157.     OBJECT            *ptree;
  158.     register OBJECT   *pobj;
  159.     register XUSERBLK *pblk;
  160.     register long     *pspec;
  161.     register int       obflags;
  162.     register int       numobj = 0;
  163.  
  164. /*
  165.  * do setup stuff...
  166.  */
  167.  
  168.     if (0 == apl_vshared()) {   /* force open shared workstation, also  */
  169.         return -35;             /* tests to make sure one is available. */
  170.     }
  171.  
  172.     if (precalcs.outer_radius == 0) {   /* this must follow apl_vshared() */
  173.         init_precalcs();
  174.     }
  175.  
  176. /*
  177.  * count the number of button objects we'll be transforming...
  178.  */
  179.  
  180.     for (pobj = ptree; ; ++pobj) {
  181.         obflags = pobj->ob_flags;         
  182.         if ((pobj->ob_type & 0x00FF) == G_BUTTON
  183.          && !(obflags & (EXIT|DEFAULT))) {
  184.             ++numobj;
  185.         }
  186.         if (obflags & LASTOB) {         /* stop after doing last    */
  187.             break;                      /* object in the tree.      */
  188.         }
  189.     }
  190.  
  191.  
  192. /*
  193.  * allocate a chunk of memory to hold all the XUSERBLKs we're going
  194.  * to attach to the objects.
  195.  */
  196.  
  197.     if (NULL == (pblk = apl_malloc((long)(numobj * sizeof(*pblk))))) {
  198.         return -39;
  199.     }
  200.  
  201. /*
  202.  * now go through and change each non-exit button object into a USERDEF.
  203.  */
  204.  
  205.     for (pobj = ptree; ; ++pobj) {
  206.         obflags = pobj->ob_flags;         
  207.         if ((pobj->ob_type & 0x00FF) == G_BUTTON
  208.          && !(obflags & (EXIT|DEFAULT))) {
  209.             obj_mxuserdef(pblk++, pobj, cua_draw);
  210.         }
  211.         if (obflags & LASTOB) {         /* stop after doing last    */
  212.             break;                      /* object in the tree.      */
  213.         }
  214.     }
  215.  
  216.     return 0;
  217. }
  218.  
  219.